package com.alibaba.controller;

import com.alibaba.domain.User;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import lombok.AllArgsConstructor;

import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

//订单服务
@RestController
@AllArgsConstructor
@DefaultProperties(defaultFallback ="fallbackMethod") //统一降级配置
public class OrderController {
    //等于注入
    private final RestTemplate restTemplate;
    @HystrixCommand
//  @HystrixCommand(fallbackMethod = "fallbackMethod")   //方法熔断
    @RequestMapping(value = "/getUserById/{id}",method = RequestMethod.GET)
    public User getUserById(@PathVariable("id")Long id){
        //通过http请求 调用user的getUserById
        //String url = "http://localhost:1080/getUserById/" + id;
        //使用服务名调用(ribbon会根据服务名  到eureka中  找到对应的ip和端口)
        String url = "http://user-server/getUserById/" + id;
        //通过restTemplate  调用
        return restTemplate.getForObject(url, User.class);
    }

    /*
    降级方法
    方法名要和fallbackMethod指定的方法名相同
    请求参数要和原来的方法(getUserById  就是需要熔断的方法)相同
    返回值类型要和原来的方法(getUserById  就是需要熔断的方法)相同
     */
    //    public User fallbackMethod(@PathVariable("id")Long id) {
    //        //返回托底数据
    //        return new User(-1L, "大脑壳谌媾觏", "她的脑壳爆掉咯 不要再搞她的三级头和平底锅")    };

    //托底方法
    //公共的托底方法不应该有参数。返回类型必须和熔断的方法的返回类型兼容，比如这里可以返回User或者User的子类。
    public User fallbackMethod(){
        //返回友好的提示信息
        return new User(-1L,"大脑壳谌媾觏","她的脑壳爆掉咯 不要再搞她的三级头和平底锅咯");
    }

}
